package matsk.mszdqabbs.IO;

import matsk.mszdqabbs.Utils.PictureUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class CustomIO {
    private static final long MAX_ALLOWED_SIZE = 1048576L;//最大允许1MB的图片


    /**
     * 用来将用户上传的图片或其他文件保存在本地硬盘上
     * 若保存成功，会返回一个Map，包含带生成文件名文件名的物理路径和生成文件名
     * 若保存失败，返回Null
     * @param whereToSave 希望存放的物理路径
     * @param multipartFile 用户上传的文件
     * @param supportSuffix 允许的文件后缀
     * @return
     */
    public Map<String, String> doSave(String whereToSave,
                                      MultipartFile multipartFile,
                                      List<String> supportSuffix) {
        Map<String, String> res = null;
        String originalName = multipartFile.getOriginalFilename();
        if (originalName != null) {
            int dotIndex = originalName.lastIndexOf(".");
            if(dotIndex != -1) {
                String suffix = originalName.substring(dotIndex);
                if(supportSuffix.contains(suffix)) {
                    String autoGeneratedName = System.currentTimeMillis()
                            + (int)(Math.random() * 100) + suffix;
                    File toSave = new File(whereToSave + autoGeneratedName);
                    if(!toSave.exists())
                        if(!toSave.mkdirs()) {
                            return null;
                        }
                    //执行存储
                    try {
                        multipartFile.transferTo(toSave);
                        //若用户上传的图片过大，则需要进行压缩处理
                        if(toSave.length() > MAX_ALLOWED_SIZE) {
                            //重新生成一个新的图片文件名称，标识压缩后的图片
                            autoGeneratedName = System.currentTimeMillis()
                                    + (int)(Math.random() * 100) + suffix;
                            //创建压缩图片文件
                            File lowQualityImage = new File(whereToSave
                                    + autoGeneratedName);
                            //压缩至500KB左右
                            PictureUtils.lowQuality(
                                    whereToSave + toSave.getName()
                                    ,whereToSave + lowQualityImage.getName(),
                                    512);
                            //删除未压缩的图片文件
                            if(!toSave.delete()) {
                                return null;
                            }
                            //替换压缩后的图片文件
                            toSave = lowQualityImage;
                        }
                        //保存成功
                        res = new HashMap<>();
                        res.put("filePath", whereToSave + autoGeneratedName);
                        res.put("name", autoGeneratedName);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return res;
    }
}
